//
//  HMComposeView.swift
//  WeiBo
//
//  Created by apple on 16/6/29.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit
import pop

// 定义一个枚举,来定义按钮的动画方法
enum ComposeAnimationType: Int {
    case UP = 0
    case Down = 1
    case Left = 2
    
}

class HMComposeView: UIView {

    
    // 定义一个成员变量,来接收控制器
    var viewController: UIViewController?
    
    // 创建一个数组,来盛放按钮
    private lazy var composeButtons: [UIButton] = [UIButton]()
    
    // 第一步 -- 重写构造函数
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 第二步 -- 定义一个方法,来实现 视图的添加和布局
    private func setupUI(){
        
        // 改变背景颜色
        backgroundColor = UIColor.yellowColor()
        // 设置一下frmae
        var frame = self.frame
        
        frame.size = kUIScreenSize
        
        self.frame = frame
        
        
        addSubview(bgImageView)
        
        bgImageView.snp_makeConstraints { (make) -> Void in
            
            make.edges.equalTo(self.snp_edges)
            
        }
        
//        addButtons()
        
        let button = HMComposeButton()
        
        // 设置图片
        button.setImage(UIImage(named: "tabbar_compose_friend"), forState: .Normal)
        // 设置标题
        button.setTitle("好哟", forState: .Normal)
//        button.setTitleColor(UIColor.darkGrayColor(), forState: .Normal)

        button.frame.size = CGSizeMake(80, 110)
        button.frame.origin.x = 0
        button.frame.origin.y = 0
        
        addSubview(button)
        
        
//        // 添加动画
//        // 创建一个spring动画对象
//        
//        // propertyNamed 可以针对不同的 layer/UIView/UIScrollView 设置不同的属性
//        let anim = POPSpringAnimation(propertyNamed: kPOPViewCenter)
//        
//        // 修改toValue, 让视图到指定的位置
//        anim.toValue = NSValue(CGPoint: CGPointMake(button.center.x, button.center.y + 300))
//        //  弹性的反弹
//        anim.springBounciness = 4
//        //  设置sprintSpeed
//        anim.springSpeed = 10
//        // 添加动画
//        button.pop_addAnimation(anim, forKey: nil)
        
        addButtons()
        
    }
    // 添加按钮的方法
    private func addButtons(){
        
//        
//        let button = HMComposeButton()
//        
//        // 设置图片
//        button.setImage(UIImage(named: "tabbar_compose_friend"), forState: .Normal)
//        // 设置标题
//        button.setTitle("好哟", forState: .Normal)
////        button.setTitleColor(UIColor.darkGrayColor(), forState: .Normal)
//        
//        button.frame.size = CGSizeMake(80, 110)
//        button.frame.origin.x = 0
//        button.frame.origin.y = 0
//        
//        addSubview(button)
        
        // 0 .设置一下固定值
        let maxRow = 3
        let childButtonW: CGFloat = 80
        let childButtonH: CGFloat = 110
        let childButtonMargin = ( kUIScreenWidth - 3 * childButtonW ) / (CGFloat(maxRow) + 1)
        
        
        
        // 1. 读取plist文件
        let composeArray = NSArray(contentsOfFile: NSBundle.mainBundle().pathForResource("compose.plist", ofType: nil)!)!
    
        
        // 2. 对数组进行遍历
        for i in 0..<composeArray.count {
            
            
            // 3
            let button = HMComposeButton()
            
            // 4. 拿到数据
            //  as! 只要程序员敢保证前边的数据有值,而且类型也正确就可以 as!
            let imageString = composeArray[i]["icon"] as! String
            let title = composeArray[i]["title"] as! String
            // 设置图片
            button.setImage(UIImage(named: imageString), forState: .Normal)
            // 设置标题
            button.setTitle(title, forState: .Normal)
            
            button.addTarget(self, action: "buttonClick:", forControlEvents: .TouchUpInside)
            
            // 5. 设置frame
            
            button.frame.size = CGSizeMake(childButtonW, childButtonH)
            
            // x = margin * (列 + 1) + width * (列)
            // 列
            let col = i % (maxRow)
            // 行
            let row = i / maxRow
            
            button.frame.origin.x = childButtonMargin * CGFloat(col + 1) + childButtonW * CGFloat(col)
            // y = margin * 行 + height * 行
            
            button.frame.origin.y = childButtonMargin * CGFloat(row) + childButtonH * CGFloat(row) + KUIScreenHeight
            
            addSubview(button)

            
            // 添加到数组
            composeButtons.append(button)
        }
        
        
    }
    
    // MARK:-- 添加按钮动画的方法
    private func addButtonAnmation(button: UIButton,time: CFTimeInterval,type: ComposeAnimationType) {
        
        
        let anim = POPSpringAnimation(propertyNamed: kPOPViewCenter)
        
        // 修改toValue, 让视图到指定的位置
        if type == .UP { // up
        
        
            anim.toValue = NSValue(CGPoint: CGPointMake(button.center.x, button.center.y - KUIScreenHeight + 300))
        } else if type == .Down { // down
            
            anim.toValue = NSValue(CGPoint: CGPointMake(button.center.x, button.center.y + KUIScreenHeight ))
        }
        
        //  弹性的反弹
        anim.springBounciness = 4
        //  设置sprintSpeed
        anim.springSpeed = 10
        
//       let time = CACurrentMediaTime()
        // 动画的开始时间
        // CFTimeInterval
        anim.beginTime = time
        
        // 添加动画
        button.pop_addAnimation(anim, forKey: nil)
       
        
    }
    
    // MARK:-- 这个是 对象方法
    func show(target: UIViewController){
    
        viewController = target
        
        viewController?.view.addSubview(self)
        
        // 对数组进行遍历,来添加动画
        for (index,button) in composeButtons.enumerate() {
            
            addButtonAnmation(button, time: CACurrentMediaTime() + 0.025 * Double(index),type: .UP)
            
        }
        
    }
    
    
    //MARK:-- 类方法
    // 通过类方法,实现方法的调用,方便外接调用
    class func show(target: UIViewController){
        
        HMComposeView().show(target)
        
    }
    
    // MARK:-- 实现touch方法
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        
        print("走了吗?")
       
        
        // 根据动画效果,是反着来的,所以我们的数组也可以反着遍历
        for (index,button) in composeButtons.reverse().enumerate() {
            
            addButtonAnmation(button, time: CACurrentMediaTime() + 0.025 * Double(index),type: .Down)
            
        }
        
        // 为什么直接remove 没有任何效果,因为动画还没有来得及执行
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.3 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
            self.removeFromSuperview()
        }
        
        
    }
    
    //MARK:-- 按钮点击方法
    @objc private func buttonClick(button: UIButton){
        
       //
        UIView.animateWithDuration(0.25, animations: { () -> Void in
            for value in self.composeButtons{
                // 让所有的控件的alpha 都变成0
                value.alpha = 0
                
                if value == button {
                    
                    value.transform = CGAffineTransformMakeScale(2.0, 2.0)
                    
                } else {
                    
                    value.transform = CGAffineTransformMakeScale(0.3, 0.3)
                }
                
                
            }
            
            }) { (_) -> Void in
               // 动画完成之后,进行页面的跳转
                
                let publish = HMPublishViewController()
                
                let nav = UINavigationController(rootViewController: publish)
                
              self.viewController?.presentViewController(nav
                , animated: true, completion: { () -> Void in
                
                    // 把自己移除
                    self.removeFromSuperview()
                    
              })
        }
        
    }
    
    // MARK:-- 获取当前屏幕的截图
    func getScreenShot() -> UIImage{
        
        
        // 1. 先要获取一下当前的window
        let window = UIApplication.sharedApplication().keyWindow!
        // 2. 开启绘图
        /*
            size: 大小
            opaque:是否透明
            scale: 缩放系数
        */
        UIGraphicsBeginImageContextWithOptions(kUIScreenSize, false, 1)
        
        // 3. 把window画在画板上
        window.drawViewHierarchyInRect(kUIScreenBounds, afterScreenUpdates: false)
        
        // 4. 拿到image
        let image = UIGraphicsGetImageFromCurrentImageContext()
        
        // 5. 关闭画板
        UIGraphicsEndImageContext()
        
        return image
    }
    
    // 第三步: 懒加载控件
    private lazy var bgImageView: UIImageView = {
    
        let img = UIImageView()
        
        img.image = UIImage.getScreenShot() //self.getScreenShot()
        
        // iOS 8 之后,系统为我们提供了一个毛玻璃效果
        // 
        let effect = UIBlurEffect(style: UIBlurEffectStyle.Light)
        
        // 创建一个毛玻璃视图
        let effectView = UIVisualEffectView(effect: effect)
        
        // 把这个毛玻璃添加到 img
        img.addSubview(effectView)
        
        // 设置毛玻璃视图的约束
        effectView.snp_makeConstraints(closure: { (make) -> Void in
           make.edges.equalTo(img.snp_edges)
        })
        
        return img
    }()

    
    
}
